Java Persistence API (JPA) অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং মডেলের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল Inheritance। এটি ডাটাবেসের টেবিল এবং জাভা ক্লাসের মধ্যে অবজেক্ট-ওরিয়েন্টেড উত্তরাধিকার (Inheritance) মডেল পরিচালনার জন্য ব্যবহৃত হয়। জাভার ইনহেরিটেন্স কনসেপ্টকে ডাটাবেসে রিফ্লেক্ট করতে JPA বিভিন্ন স্ট্র্যাটেজি প্রদান করে।
Inheritance কি?
Inheritance হল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের একটি মৌলিক বৈশিষ্ট্য, যা এক ক্লাসের বৈশিষ্ট্য (Attributes) এবং মেথড (Methods) আরেকটি ক্লাসে শেয়ার করার সুযোগ দেয়। JPA ইনহেরিটেন্সের মাধ্যমে, আমরা প্যারেন্ট ক্লাসের তথ্য একাধিক চাইল্ড ক্লাসের মধ্যে শেয়ার করতে পারি এবং সেগুলো ডাটাবেস টেবিলের মধ্যে সঠিকভাবে ম্যাপ করতে পারি।
JPA Inheritance এর প্রয়োজনীয়তা
- কোড পুনরায় ব্যবহারযোগ্য করা: প্যারেন্ট ক্লাসের সাধারণ বৈশিষ্ট্যগুলো চাইল্ড ক্লাসে ব্যবহার করা যায়।
- ডাটাবেস মডেলিং সহজতর করা: অবজেক্ট-ওরিয়েন্টেড ইনহেরিটেন্সের সমতুল্য একটি রিলেশনাল ডাটাবেস মডেল তৈরি করা।
- ডাটা সংগঠনের সুবিধা: অভিন্ন বৈশিষ্ট্যগুলো এক জায়গায় রাখা, যা ডাটার পুনরাবৃত্তি (Data Redundancy) কমায়।
- পরিচালনা সহজ করা: ইনহেরিটেড ক্লাসগুলোর মাধ্যমে ডাটাবেস অপারেশন পরিচালনা আরও কার্যকর হয়।
JPA Inheritance এর স্ট্র্যাটেজি
JPA-তে ইনহেরিটেন্স ব্যবস্থাপনার জন্য তিনটি স্ট্র্যাটেজি ব্যবহৃত হয়:
Single Table Strategy
একটি মাত্র টেবিলে সব প্যারেন্ট এবং চাইল্ড ক্লাসের তথ্য রাখা হয়। এটি দ্রুত এবং কার্যকর কিন্তু ডাটা রিডান্ডেন্সি বাড়তে পারে।
উদাহরণ:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
public class Employee {
@Id
private Long id;
private String name;
}
@Entity
public class FullTimeEmployee extends Employee {
private double salary;
}
@Entity
public class PartTimeEmployee extends Employee {
private double hourlyRate;
}
টেবিল গঠন:
| ID | NAME | TYPE | SALARY | HOURLY_RATE |
|---|---|---|---|---|
| 1 | Alice | FullTimeEmployee | 50000 | NULL |
| 2 | Bob | PartTimeEmployee | NULL | 20 |
Table Per Class Strategy
প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি হয়। এটি রিলেশনাল ডাটাবেসের জন্য আরও স্বচ্ছ, কিন্তু কার্যকারিতা কিছুটা কম হতে পারে।
উদাহরণ:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Employee {
@Id
private Long id;
private String name;
}
@Entity
public class FullTimeEmployee extends Employee {
private double salary;
}
@Entity
public class PartTimeEmployee extends Employee {
private double hourlyRate;
}
টেবিল গঠন:
Employee (প্যারেন্ট টেবিল):
ID NAME 1 Alice 2 Bob FullTimeEmployee (চাইল্ড টেবিল):
ID SALARY 1 50000 PartTimeEmployee (চাইল্ড টেবিল):
ID HOURLY_RATE 2 20
Joined Strategy
প্যারেন্ট ক্লাস এবং চাইল্ড ক্লাসের জন্য আলাদা টেবিল তৈরি হয় এবং তাদের মধ্যে যোগসূত্র থাকে। এটি নরমালাইজড ডাটাবেস মডেল তৈরি করে এবং ডাটা রিডান্ডেন্সি কমায়।
উদাহরণ:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Employee {
@Id
private Long id;
private String name;
}
@Entity
public class FullTimeEmployee extends Employee {
private double salary;
}
@Entity
public class PartTimeEmployee extends Employee {
private double hourlyRate;
}
টেবিল গঠন:
Employee (প্যারেন্ট টেবিল):
ID NAME 1 Alice 2 Bob FullTimeEmployee (চাইল্ড টেবিল):
ID SALARY 1 50000 PartTimeEmployee (চাইল্ড টেবিল):
ID HOURLY_RATE 2 20
কোন স্ট্র্যাটেজি কখন ব্যবহার করবেন?
- Single Table Strategy:
- যখন পারফরম্যান্স গুরুত্বপূর্ণ।
- সাধারণ ইনহেরিটেন্স কাঠামোর জন্য।
- Table Per Class Strategy:
- ছোট টেবিল এবং সহজ স্ট্রাকচার দরকার হলে।
- Joined Strategy:
- ডাটা রিডান্ডেন্সি কমানোর প্রয়োজন হলে এবং রিলেশনাল ডাটাবেসের সাথে মিলিয়ে কাজ করতে হলে।
সারাংশ
JPA Inheritance ডাটাবেস এবং জাভা অবজেক্টের মধ্যে ইনহেরিটেন্স মডেল তৈরি করতে গুরুত্বপূর্ণ ভূমিকা পালন করে। এটি ডাটাবেস মডেলিংকে আরও কার্যকর এবং অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের সাথে সামঞ্জস্যপূর্ণ করে। Inheritance এর বিভিন্ন স্ট্র্যাটেজি ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনের প্রয়োজন অনুযায়ী ডাটাবেস ডিজাইন করতে পারেন।
Read more